package com.aasa.siccosap.dao;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.sql.DataSource;

import org.apache.log4j.Logger;

import com.aasa.siccosap.bean.NotaCredito;
import com.aasa.siccosap.bean.ParametrosConsultaCuentaCorriente;
import com.aasa.siccosap.bean.ParametrosGenerales;
import com.aasa.siccosap.util.Constantes;

import oracle.jdbc.OracleTypes;

	/**
	 * Data access object (DAO) for domain model class NotaCredito.
	 * 	 
	 */

public class NotaCreditoDAO extends ConsultaClienteBaseDAO {
	
	
	static Logger logger = Logger.getLogger("NotaCreditoDAO.class");
	public NotaCreditoDAO()	throws accesoDaoException {
		super();
	}
	
	public NotaCreditoDAO(DataSource dataSource) {
		super(dataSource);
	}

	public List<NotaCredito> consultarNotasCreditoCompleta(ParametrosGenerales parametros) throws Exception{        
		List<NotaCredito> consultaNotasCredito = new ArrayList<NotaCredito>();		
		this.storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_CONSULTA_NOTAS_CREDIT(?,?,?,?,?); end;";						
		consultaNotasCredito = consultarNotasCreditoAll(parametros); 

        return(consultaNotasCredito);        
    }
	
	public List<NotaCredito> consultarNotasCreditoOmitirDocumentosAplicados(ParametrosGenerales parametros) throws Exception{        
		List<NotaCredito> consultaNotasCredito = new ArrayList<NotaCredito>();		
		this.storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_NOTAS_CREDITO_NCAAP(?,?,?,?,?); end;";						
		consultaNotasCredito = consultarNotasCredito(parametros); 
		
        return(consultaNotasCredito);        
    }
	
	private List<NotaCredito> consultarNotasCredito(ParametrosGenerales parametros) throws Exception{
        ResultSet rs = null;
        this.av_message = null;       
        
        
        List<NotaCredito> consultaNotasCredito = new ArrayList<NotaCredito>();
        try{
                this.conn = dataSource.getConnection();
                this.stmt = this.conn.prepareCall(storedProcedure);
                              
                configuraParametrosConsultaClienteGenerales(parametros);
                
                this.stmt.execute();

                //Se obtiene la respuesta error/exito del stored
                this.av_message = (String)stmt.getObject(1);
                	
                    if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
                        //Se obtiene el objeto del cursor
                        rs = (ResultSet)stmt.getObject(2);
                        while(rs.next()){
                        		NotaCredito registroNotaCredito = creaRegistroConsultaNotasCredito(rs);
                                consultaNotasCredito.add(registroNotaCredito);
                                System.out.println("SE ENTRA EN EL WHILE");
                        }
                        System.out.println("NO SE ENTRA EN EL WHILE");
                }else{
                    return null;
                }
                    
               
                    

        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		close(this.conn, rs, stmt);
        }
        return(consultaNotasCredito);
      
        
    }
	
	private List<NotaCredito> consultarNotasCreditoAll(ParametrosGenerales parametros) throws Exception{
        ResultSet rs = null;
        this.av_message = null;
        
        List<NotaCredito> lstncfinal = new ArrayList<NotaCredito>();  
        
        List<NotaCredito> consultaNotasCredito = new ArrayList<NotaCredito>();
        try{
                this.conn = dataSource.getConnection();
                this.stmt = this.conn.prepareCall(storedProcedure);
                              
                configuraParametrosConsultaClienteGenerales(parametros);
                
                this.stmt.execute();

                //Se obtiene la respuesta error/exito del stored
                this.av_message = (String)stmt.getObject(1);
                	
                    if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
                        //Se obtiene el objeto del cursor
                        rs = (ResultSet)stmt.getObject(2);
                        while(rs.next()){
                        		NotaCredito registroNotaCredito = creaRegistroConsultaNotasCredito(rs);
                                consultaNotasCredito.add(registroNotaCredito);
                        }
                }else{
                    return null;  
                }
                    
                    
                    
           /*se comento estas lineas porque el metodo consultarDocAplicados
            * usa un procedimiento que maneja tablas como cobranzas y su definicion no esta clara respecto alas 
            * nuevas interfaces,loq hace este metodo es setear al Nota de credito con los atributos 
            * serie ,numero,tipo y fecha aplicado cosa que ya se hizo en el metodo consultarNotasCreditoAll
            * 
            * 
             for(int i=0; i<consultaNotasCredito.size();i++){  //SE EJECUTA 3 VECES 
            	  // consultaNotasCredito.size()=3
            	  List<NotaCredito>  lst= consultarDocAplicados(consultaNotasCredito.get(i));
            	  
            	  if(lst.size()>0){//lst.size=2 CON NC CON 4 CAMPOS
            	  
            	 for(int j=0; j<lst.size(); j++){ //SE EJECUTA 2 VECES
            		  
            		  NotaCredito bean = new NotaCredito();
            		  
            		  if(j==0){//SOLO 1 VEZ
          	        
            	        bean.setObjPb_fechaEmision(consultaNotasCredito.get(i).getObjPb_fechaEmision());
            	        bean.setStrPb_serieManual(consultaNotasCredito.get(i).getStrPb_serieManual());
            	        bean.setStrPb_numeroManual(consultaNotasCredito.get(i).getStrPb_numeroManual());
            	        bean.setDblPb_importeSoles(consultaNotasCredito.get(i).getDblPb_importeSoles());
            	        bean.setDblPb_importeDolares(consultaNotasCredito.get(i).getDblPb_importeDolares());
            	        bean.setDblPb_saldoSoles(consultaNotasCredito.get(i).getDblPb_saldoSoles());
            	        bean.setDblPb_saldoDolares(consultaNotasCredito.get(i).getDblPb_saldoDolares());
            		  }
            	        
            	        bean.setStrPb_serieAplicado(lst.get(j).getStrPb_serieAplicado());                
            	        bean.setStrPb_numeroAplicado(lst.get(j).getStrPb_numeroAplicado());
            	        bean.setStrPb_tipoAplicado(lst.get(j).getStrPb_tipoAplicado());
            	        bean.setObjPb_fechaAplicado(lst.get(j).getObjPb_fechaAplicado());
            	        
            	        lstncfinal.add(bean); //SE AGREGARA 2 VECES 
            		  
            		  
            	  }
            	  }
            	  else{   //SI LST.SIZE()==0 ESTA LINEA YA NO SE EJECUTA
            		  
            		  
            		  lstncfinal.add(consultaNotasCredito.get(i)); //SE EJECUTA 3 VECES SI lst.size()==0
            		  
            	  }
            	  
              }
                    
                    
          */          

        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		close(this.conn, rs, stmt);
        }
        
        lstncfinal=  consultaNotasCredito;       //return(consultaNotasCredito);
        return(lstncfinal);
        
    }
    
	//18/10/2011 rnm: Solo debe ser llamado por consultarNotasCreditoAll ya que no debe abrir nueva conexion
    private List<NotaCredito> consultarDocAplicados(NotaCredito notaCredito) {
    	ResultSet rs = null;
        this.av_message = null;
        this.storedProcedure = "begin CONSULTA_CLIENTES_PKG.P_CONSULTA_DOCUAPLI_NC(?,?,?); end;";
        List<NotaCredito> consultaNotasCredito = new ArrayList<NotaCredito>();
        
        
        try {
        	
        	//this.conn = dataSource.getConnection(); genera conexiones abiertas con la llamada desde consultarNotasCreditoAll()
            this.stmt = this.conn.prepareCall(storedProcedure);
                          
            stmt.registerOutParameter(1, OracleTypes.CURSOR);        	
            stmt.setString(2, notaCredito.getStrPb_serieManual());
            stmt.setString(3, notaCredito.getStrPb_numeroManual());
            
            this.stmt.execute();

                    //Se obtiene el objeto del cursor
              rs = (ResultSet)stmt.getObject(1);
              while(rs.next()){
            	  NotaCredito bean = new NotaCredito();
            	  	    
                  bean.setStrPb_serieAplicado( rs.getString("SERIE_APL"));                
                  bean.setStrPb_numeroAplicado(rs.getString("NUMERO_APL"));
                  bean.setStrPb_tipoAplicado(	rs.getString("TIPO_APL"));
                  bean.setObjPb_fechaAplicado(rs.getDate("FECHA_APL"));
            	  
               
                consultaNotasCredito.add(bean);
                }
           
        	
        	
			
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		
		finally{
    		//close(this.conn, rs, stmt);; genera conexiones abiertas con la llamada desde consultarNotasCreditoAll()
			close(null, rs, stmt);
		}
		
		return consultaNotasCredito;
        
	}

	private NotaCredito creaRegistroConsultaNotasCredito(ResultSet rs) throws SQLException {
        
    	NotaCredito bean = new NotaCredito();
            	        
        bean.setObjPb_fechaEmision(rs.getDate("FEC_EMI"));
        bean.setStrPb_serieManual(rs.getString("SERIE_MANUAL"));
        bean.setStrPb_numeroManual(rs.getString("NUMERO_MANUAL"));
        bean.setDblPb_importeSoles(rs.getDouble("IMPORTE_SOLES"));
        bean.setDblPb_importeDolares(rs.getDouble("IMPORTE_DOLARES"));
        bean.setDblPb_saldoSoles(rs.getDouble("SALDO_NC_SOLES"));
        bean.setDblPb_saldoDolares(rs.getDouble("SALDO_NC_DOLARES"));
        
        
        
        System.out.println(bean.getStrPb_serieManual()+"  serie de nota de credito");
        String serieAplicado= null;
        String numeroAplicado= null;
        String tipoAplicado= null;
        Date fechaAplicado= null;
       
      
      
        
        
        try {
	        serieAplicado = rs.getString("SERIE_APL");
	        numeroAplicado = rs.getString("NUMERO_APL");
	        tipoAplicado = 	rs.getString("TIPO_APL");	        
	        fechaAplicado = rs.getDate("FECHA_APL");	        
        }catch(SQLException e){
        	serieAplicado = null;
	        numeroAplicado = null;
	        tipoAplicado = 	null;
	        fechaAplicado = null;
        }catch(IllegalArgumentException a){
        	fechaAplicado = null;
        }
        
      
      
        bean.setStrPb_serieAplicado(serieAplicado==null?"":serieAplicado);                
        bean.setStrPb_numeroAplicado(numeroAplicado==null?"":numeroAplicado);
        bean.setStrPb_tipoAplicado(tipoAplicado==null?"":tipoAplicado);
        bean.setObjPb_fechaAplicado(fechaAplicado);
        System.out.println(serieAplicado+"  la serie se  muestra");
        return (bean);
    }

	public List<NotaCredito> consultarSaldoNc(
			ParametrosConsultaCuentaCorriente parametros) throws Exception{
		
		ResultSet rs = null;
        this.av_message = null;
        this.storedProcedure = "begin CONSULTA_GARANTIAS_PKG.P_NOTAS_CREDITO(?,?,?); end;";
        
        List<NotaCredito> consultaNotasCredito = new ArrayList<NotaCredito>();
		
		
		try {
			 this.conn = dataSource.getConnection();
             this.stmt = this.conn.prepareCall(storedProcedure);
             
             stmt.registerOutParameter(1, OracleTypes.VARCHAR);               
             stmt.registerOutParameter(2, OracleTypes.CURSOR);                 	
             stmt.setString(3, parametros.getStrPb_codigoCliente());
             
             this.stmt.execute();
             
             //Se obtiene la respuesta error/exito del stored
             this.av_message = (String)stmt.getObject(1);
             
             if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
                 //Se obtiene el objeto del cursor
                 rs = (ResultSet)stmt.getObject(2);
                 while(rs.next()){
                	 
                	 NotaCredito bean = new NotaCredito();
                	 
                     bean.setObjPb_fechaEmision(rs.getDate("FEC_EMI"));
                     bean.setStrPb_serieManual(rs.getString("SERIE_MANUAL"));
                     bean.setStrPb_numeroManual(rs.getString("NUMERO_MANUAL"));
                     bean.setDblPb_importeSoles(rs.getDouble("IMPORTE_SOLES"));
                     bean.setDblPb_importeDolares(rs.getDouble("IMPORTE_DOLARES"));
                     bean.setDblPb_saldoSoles(rs.getDouble("SALDO_NC_SOLES"));
                     bean.setDblPb_saldoDolares(rs.getDouble("SALDO_NC_DOLARES"));
                     consultaNotasCredito.add(bean);
                 }
         }else{
             return null;
         }
			
			
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		
		finally{
    		close(this.conn, rs, stmt);
			}
		
		return consultaNotasCredito;
	}
         
}
